<?php

namespace App\Services;

use App\Exceptions\InvalidRequestException;
use Illuminate\Support\Facades\Log;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Iai\V20200303\IaiClient;
use TencentCloud\Iai\V20200303\Models\DetectFaceSimilarityRequest;

class TencentFaceService
{
    /**
     * 腾讯云客户端实例
     * @var IaiClient|null
     */
    protected $client = null;

    /**
     * 初始化腾讯云客户端
     */
    public function FaceSimilarity($UrlA,$UrlB)
    {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性
            // 以下代码示例仅供参考，建议采用更安全的方式来使用密钥
            // 请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            $cred = new Credential(env("UPLOAD_APP_ID"), env("UPLOAD_APP_KEY"));
            // 使用临时密钥示例
            // $cred = new Credential("SecretId", "SecretKey", "Token");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            $httpProfile = new HttpProfile();
            $httpProfile->setEndpoint("iai.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            $clientProfile = new ClientProfile();
            $clientProfile->setHttpProfile($httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            $client = new IaiClient($cred, "", $clientProfile);

            // 实例化一个请求对象,每个接口都会对应一个request对象
            $req = new DetectFaceSimilarityRequest();

            $params = array(
                "ImageA" => $UrlA,
                "UrlB" => $UrlB
            );
            $req->fromJsonString(json_encode($params));

            // 返回的resp是一个DetectFaceSimilarityResponse的实例，与请求对象对应
            $resp = $client->DetectFaceSimilarity($req);

            $res = json_decode($resp->toJsonString());
            return $res;

        }
        catch(TencentCloudSDKException $e) {
            Log::info(json_encode($e));
            throw new InvalidRequestException('比对失败');
        }
    }

    /**
     * 将图片文件转换为Base64编码
     *
     * @param string $filePath 图片文件路径
     * @return string Base64编码字符串
     * @throws \Exception
     */
    public function convertImageToBase64(string $filePath): string
    {
        if (!file_exists($filePath)) {
            throw new \Exception('图片文件不存在');
        }

        $fileInfo = pathinfo($filePath);
        $extension = strtolower($fileInfo['extension'] ?? '');

        // 检查文件类型
        $allowedTypes = ['jpg', 'jpeg', 'png', 'bmp'];
        if (!in_array($extension, $allowedTypes)) {
            throw new \Exception('不支持的图片格式，仅支持jpg、jpeg、png、bmp');
        }

        $imageData = file_get_contents($filePath);
        if (!$imageData) {
            throw new \Exception('无法读取图片文件');
        }

        return base64_encode($imageData);
    }
}
